package com.dcy.common.utils;

import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @Author：dcy
 * @Description: lamda方式关联表
 * @Date: 2021/10/23 7:53
 */
public class ViewMapper {

    /**
     * 数据映射
     *
     * @param dtoList       数据集合
     * @param viewReference 根据ids查询map映射
     * @param keyFun        根据dto获取key
     * @param mapping       输入dto和val获取dto（dto和val的映射赋值）
     * @param <DTO>         dto对象
     * @param <K>           key对象
     * @param <V>           val对象
     */
    public static <DTO, K, V> List<DTO> batchMapView(List<DTO> dtoList, Function<Collection<K>, Map<K, V>> viewReference, Function<DTO, K> keyFun, BiFunction<DTO, V, DTO> mapping) {
        // 获取所有的key值
        final Set<K> kSet = dtoList.stream().map(keyFun).filter(Objects::nonNull).collect(Collectors.toSet());
        // 根据key值获取
        final Map<K, V> kvMap = viewReference.apply(kSet);
        dtoList.forEach(dto -> Optional.ofNullable(keyFun.apply(dto)).ifPresent(k -> mapping.apply(dto, kvMap.get(k))));
        return dtoList;
    }
}
